// 1. 联合类型
let a: string | number = 123;
a = "hello";
// a = true; // error
// a.split('')

function fn(value: string | number) {
  (value as string).split("");
}
// fn(123)

// 2. 类型断言 as
// unknown 类型要使用属性或方法，类型断言成某个具体类型才能使用
// 联合类型要使用属性或方法，类型断言成某个具体类型才能使用

// 3. 交叉类型
interface P1 {
  name: string;
}
interface P2 {
  age: number;
}
type P3 = P1 & P2;
const p: P3 = {
  name: "jack",
  age: 18,
};

// 4. 类型别名
type str = string;
const s: str = "hello";
type Arr = number[];

// 5. 类型推论
// 开发中定义类型：先将js代码写好，再看代码是否报错在定义类型（如果类型推论为any，也需要定义类型）
let b = 123;
const arr = []; // 数组数据会自动推论为 never[], 这样类型没法使用，手动给类型

// 6. 字符串字面量类型
type Names = "jack" | "tom" | "rose";
const name1: Names = "rose";
